% 使用有符号曲率确定位置
% 缺点: 
% 1. 只适用于 X/Y 连续. 如果将 X/Y 元素对的顺序 shuffle, 将不能工作;
% 2. 直接用原始 Y 值减去曲率值作为新的点, 适应性不好.
%    如, 数据频率很高(因而kappa很大), 但本身动态范围不大, 则 marking 跑的太远
%    反之, 数据频率低, 动态范围较大, 则 marking 分不开
% 3. 另外, 当数据近似线性变化时, 仍不能实现分开

X = 0:.1:100;
Y = sin(2*pi*.01.*X) + 1 .* sin(2*pi*.03.*X); % 高频的例子

markIdx = 1:30:length(X);
markCount = length(markIdx);

dX = diff(X);
dX = [dX, dX(end)];

dY = diff(Y);
dY = [dY, dY(end)];

d2X = diff(dX);
d2X = [d2X, d2X(end)];

d2Y = diff(dY);
d2Y = [d2Y, d2Y(end)];

kappa = ( dX .* d2Y - d2X .* dY ) ./ (dX.^2 + dY.^2).^(3/2);

% str = cell(1, markCount);
% for i = 1:markCount
% 	str{i} = sprintf("(%.2f, %.2f)", X(markIdx(i)), Y(markIdx(i)));
% end

f = figure(1);
hold on;

yyaxis left
plot(X, Y);
% text(X(markIdx), Y(markIdx) - kappa(markIdx), str);
for i = 1:markCount
	plot([X(markIdx(i)) X(markIdx(i))], [Y(markIdx(i)), Y(markIdx(i)) - 10.* kappa(markIdx(i))], 'O');
end

% yyaxis right
% plot(X, kappa);